package bean;

import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;

import bean.vo.ItemRemitoVO;
import bean.vo.RemitoODVVO;


@Entity
@DiscriminatorValue("RemitoODV")
@SuppressWarnings({"unchecked"})
public class RemitoODV extends Remito {
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private OficinaDeVenta oficinaDeVenta;

	public RemitoODV () {}
	
	public RemitoODV (Integer numeroRemito, OficinaDeVenta odv) {
		super(numeroRemito, null, null);
		this.oficinaDeVenta = odv;
	}
	
	public RemitoODV (Integer numeroRemito, OficinaDeVenta odv, Date fechaEmision) {
		super(numeroRemito, fechaEmision, null);
		this.oficinaDeVenta = odv;
	}
	
	public RemitoODV (Integer numeroRemito, OficinaDeVenta odv, Date fechaEmision, Date fechaEntrega) {
		super(numeroRemito, fechaEmision, fechaEntrega);
		this.oficinaDeVenta = odv;
	}
	
	public RemitoODVVO getVO() {
		RemitoODVVO vo = new RemitoODVVO();
		
		vo.setFechaEmision(fechaEmision);
		vo.setFechaEntrega(fechaEntrega);
		vo.setItemsRemito(new VOList<ItemRemitoVO>().getVoList(itemsRemito));
		vo.setNumeroRemito(numeroRemito);
		vo.setProcesado(procesado);
		vo.setRecibioConforme(recibioConforme);
		vo.setOficinaDeVenta(oficinaDeVenta != null ? oficinaDeVenta.getVO() : null);
		
		return vo;
	}
	
	public OficinaDeVenta getOficinaDeVenta() {
		return oficinaDeVenta;
	}

	public void setOficinaDeVenta(OficinaDeVenta oficinaDeVenta) {
		this.oficinaDeVenta = oficinaDeVenta;
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		result = primo * (result + (numeroRemito == null ? 0 : numeroRemito.hashCode()) 
				+ (oficinaDeVenta == null ? 0 : oficinaDeVenta.hashCode()) );
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof RemitoODV))) {
			return false;
		}
		
		RemitoODV otro = (RemitoODV) obj;
		
		boolean mismaOdv = (oficinaDeVenta!=null && otro.oficinaDeVenta != null ? (oficinaDeVenta.equals(otro.oficinaDeVenta)) : false);
		boolean mismoNumero = (numeroRemito!=null && otro.numeroRemito != null ? (numeroRemito.equals(otro.numeroRemito)) : false);
		
		return mismaOdv && mismoNumero;
	}
}
